package com.tabnet.form.client;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.tabnet.beans.personnes.Client;
import com.tabnet.dao.DAOClient;
import com.tabnet.dao.DAOException;

public final class ConnexionClientForm {
    private static final String CHAMP_EMAIL  = "email";
    private static final String CHAMP_PASS   = "motdepasse";

    private String              resultat;
    private Map<String, String> erreurs      = new HashMap<String, String>();
    
    private DAOClient           _ClientDao;

    public ConnexionClientForm( DAOClient pClientDao ) {
        this._ClientDao = pClientDao;
    }

    public String getResultat() {
        return resultat;
    }
    public Map<String, String> getErreurs() {
        return erreurs;
    }

    /**
     * Méthode qui permet de retourner les informations du client
     * qui vient de se connecter
     * @param request
     * @return Client 
     */
    public Client connecterClient( HttpServletRequest request ) {
        /* Récupération des champs du formulaire */
        String email = getValeurChamp( request, CHAMP_EMAIL );
        String motDePasse = getValeurChamp( request, CHAMP_PASS );

        Client client = new Client();

        /* Validation du champ email. */
        try {
            validationEmail( email );
            client.setMail(email);
        } catch ( Exception e ) {
            setErreur( CHAMP_EMAIL, e.getMessage() );
        }

        /* Validation du champ mot de passe. */
        try {
            validationMotDePasse( motDePasse );
            client.setMDP(motDePasse);
        } catch ( Exception e ) {
            setErreur( CHAMP_PASS, e.getMessage() );
        }

        /* Initialisation du résultat global de la validation. */
        try {
	        if ( this.erreurs.isEmpty() ) {
	        	client =  this._ClientDao.getClient(this._ClientDao.checkMdp(email, motDePasse));
	            this.resultat = "Succès de la connexion.";
	        }
	        else {
	            this.resultat = "Échec de la connexion.";
	        }
        }
        catch ( DAOException e ) {
	        this.setErreur( "imprévu", "Erreur imprévue lors de la connexion." );
	        this.resultat = "Échec de la connexion du client : une erreur imprévue est survenue, merci de réessayer dans quelques instants.";
        }

        return client;
    }

    /**
     * Valide l'adresse email saisie.
     * @param email
     * @throws Exception
     */
    private void validationEmail( String email ) throws Exception {
        if ( email == null || !email.matches( "([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)" ) ) {
            throw new Exception( "Merci de saisir une adresse mail valide." );
        }
    }

    /**
     * Valide le mot de passe saisi.
     * @param motDePasse
     * @throws Exception
     */
    private void validationMotDePasse( String motDePasse ) throws Exception {
        if ( motDePasse != null ) {
            if ( motDePasse.length() < 3 ) {
                throw new Exception( "Le mot de passe doit contenir au moins 3 caractères." );
            }
        } else {
            throw new Exception( "Merci de saisir votre mot de passe." );
        }
    }

    /**
     * Ajoute un message correspondant au champ spécifié à la map des erreurs.
     * @param champ
     * @param message
     */
    private void setErreur( String champ, String message ) {
        erreurs.put( champ, message );
    }

    /**
     * Méthode utilitaire qui retourne null si un champ est vide, et son contenu
     * sinon.
     * @param request
     * @param nomChamp
     * @return string la valeur du champ
     */
    private static String getValeurChamp( HttpServletRequest request, String nomChamp ) {
        String valeur = request.getParameter( nomChamp );
        if ( valeur == null || valeur.trim().length() == 0 ) {
            return null;
        } else {
            return valeur;
        }
    }
}
